package wiki.xsx.jg.core;

import java.util.List;
import java.util.Map;

/**
 * 数据库服务接口
 */
public interface DatabaseService {

    /**
     * 根据表名称获取数据表字段及类型
     * @param tableNames 表名称
     * @return 返回字段及类型map集合
     * @throws Exception
     */
    Map<String, Map<String, Class<?>>> getTableInfo(String tableNames) throws Exception;

    /**
     * 根据类名称及其属性创建数据表
     * @param classInfoMap 类名称及其属性集合
     * @throws Exception
     */
    void createTables(Map<String, Map<String, List<Map<String, Class<?>>>>> classInfoMap) throws Exception;

    /**
     * 获取所有表的查询语句
     * @return 返回sql语句
     */
    String getAllTableSQL();

    /**
     * 根据表名称获取表结构的查询语句
     * @param tableName 表名称
     * @return 返回sql语句
     */
    String getTableStructureSQL(String tableName);

    /**
     * 根据数据库类型名称获取对应的Java类型
     * @param typeName 数据库类型名称
     * @return 返回对应类型的class对象
     */
    Class<?> getTypeClass(String typeName);

    /**
     * 根据Java类型获取数据库中数据类型
     * @param type 类对象
     * @return 返回数据库中数据类型字符串
     */
    String getDataType(Class<?> type);

    /**
     * 根据类名称获取表的删除语句
     * @param className 类名称
     * @return 返回sql语句
     */
    String getDropTableSQL(String className);

    /**
     * 根据类名称、主键集合、属性集合获取表的创建语句
     * @param className 类名称
     * @param primaryList 主键集合
     * @param isNotNullList isNotNull属性集合
     * @param isNullList isNullList属性集合
     * @return 返回sql语句
     */
    String getCreateTableSQL(
            String className,
            List<Map<String, Class<?>>> primaryList,
            List<Map<String, Class<?>>> isNotNullList,
            List<Map<String, Class<?>>> isNullList
    );

    /**
     * 获取数据库名称
     * @return 返回数据库名称
     */
    String getDBName();

    /**
     * 获取数据库驱动名称
     * @return 返回数据库驱动名称
     */
    String getDriverClassName();

    /**
     * 获取数据库地址
     * @return 返回数据库地址
     */
    String getDbUrl();

    /**
     * 获取数据库用户名
     * @return 返回数据库用户名
     */
    String getDbUserName();

    /**
     * 获取数据库用户密码
     * @return 返回数据库用户密码
     */
    String getDbPassword();

}
